package com.ruoyi.web.entity.po;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 订单数据对应实体类
 */
@Data
public class OrderPo implements Serializable {

    private Integer id;

    /**
     * 支付订单编号
     * 微信 支付 商户订单编号 （自己产生）
     */
    private Long orderNo;

    /**
     * 微信 支付宝 退单订单号 （自己产生）
     */
    private Long outTradeNo;

    /**
     * 设备编号
     */
    private Integer productId;

    /**
     * 设备类型 - 参照设备类型说明
     */
    private Integer productType;

    /**
     * 商户id
     */
    private Integer siteId;

    /**
     * 支付人openid
     */
    private String openid;

    /**
     * 用户使用金额（订单金额 - 退款金额）
     */
    private Integer useFee;

    /**
     * 订单金额
     */
    private Integer orderFee;

    /**
     * 支付金额
     */
    private Integer payFee;

    /**
     * 状态 预支付状态说明
     * 0 使用中
     * 1 已结算，这时处于待分润状态
     * 2 已分润 订单完成
     * 3 退款
     *
     * 支付分订单状态说明
     * 0 进行中
     * 1 收款中
     * 2 完成
     * 3 订单取消/退款
     */
    private Integer status;

    /**
     * 支付类型
     * 微信：  0 预支付 1支付分
     * 支付宝 ： 2 预支付  3 芝麻信用分
     */
    private Integer payType;

    /**
     * 商户名称
     */
    private String siteName;

    /**
     * 商户地址
     */
    private String siteAddress;

    /**
     * 使用时间
     */
    private Date endTime;

    private Date createTime;

    /**
     * 修改时间  再退款时使用
     */
    private Date modifyTime;

    /**
     * 系统结算时间
     */
    private Date closeTime;

    /**
     * 用户支付时间
     */
    private Date PayTime;

    /**
     * 支付分退款编号 -- 支付分退款是使用此编号，不再使用支付订单编号，详细：移步支付分退款说明
     */
    private String transactionId;

    /**
     * 支付宝用户编号
     */
    private Long userId;

    /**
     * 阿里订单授权码
     */
    private String authNo;

    /**
     * 模式（0 押金立退 1 押金退钱包）
     */
    private Integer pattern;

    /**
     * 订单余额   预付费模式使用  支付金额减去使用金额=订单余额（到钱包可提现）
     */
    private Integer balance;

    /**
     * 支付宝再次结算订单号，用于再次收款之后退款
     */
    private String aliPayNo;

    /**
     * 支付宝交易单号
     */
    private String aliTradeNo;

    /**
     *  商户号
     */
    private String mchid;

    /**
     *  预授权类型,目前支持 CREDIT_AUTH(信用预授权)
     */
    private String preAuthType;

    /**
     *  授权单状态：INIT（初始状态：已创建未授权）、AUTHORIZED（已授权状态：授权成功，可以进行转支付或解冻操作）、FINISH（完成状态：转支付完成且无剩余冻结资金）、CLOSED（关闭状态：授权未完成超时关闭或冻结资金全额解冻）
     */
    private String authStatus;

    /**
     * 累计收款金额
     */
    private Integer totalProceeds;

    /**
     * 冻结状态（0  未冻结  1 冻结中  2  已解冻 3 已完成）
     */
    private Integer freezeStatus;

    public OrderPo() {}

    /**
     * 支付分 创建订单
     * @param orderNo 订单编号
     * @param productId 设备编号
     * @param productType 设备类型
     * @param siteId 商户id
     * @param openid 微信标识
     * @param useFee 使用金额
     * @param payFee 支付金额
     * @param status 订单状态
     * @param payType 支付类型
     * @param siteName 商户名称
     * @param siteAddress 商户地址
     * @param createTime 创建时间
     */
    public OrderPo(Long orderNo, Integer productId, Integer productType, Integer siteId, String openid, Integer useFee, Integer payFee, Integer status, Integer payType, String siteName, String siteAddress, Date createTime, String mchid) {
        this.orderNo = orderNo;
        this.productId = productId;
        this.productType = productType;
        this.siteId = siteId;
        this.openid = openid;
        this.useFee = useFee;
        this.payFee = payFee;
        this.status = status;
        this.payType = payType;
        this.siteName = siteName;
        this.siteAddress = siteAddress;
        this.createTime = createTime;
        this.mchid = mchid;
    }


    /**
     * 微信支付创建订单
     * @param orderNo 订单编号
     * @param productId 设备编号
     * @param productType 设备类型
     * @param siteId 商户编号
     * @param openid 微信标识
     * @param useFee 使用金额
     * @param payFee 支付金额
     * @param status 订单状态
     * @param payType 支付类型
     * @param siteName 商户名称
     * @param siteAddress 商户地址
     * @param createTime 创建时间
     * @param closeTime 订单封顶时间
     */
    public OrderPo(Long orderNo, Integer productId, Integer productType, Integer siteId, String openid, Integer useFee, Integer orderFee, Integer payFee, Integer status, Integer payType, String siteName, String siteAddress, Date createTime, Date closeTime, String mchid) {
        this.orderNo = orderNo;
        this.productId = productId;
        this.productType = productType;
        this.siteId = siteId;
        this.openid = openid;
        this.useFee = useFee;
        this.orderFee = orderFee;
        this.payFee = payFee;
        this.status = status;
        this.payType = payType;
        this.siteName = siteName;
        this.siteAddress = siteAddress;
        this.createTime = createTime;
        this.closeTime = closeTime;
        this.mchid = mchid;
    }

    /**
     * 微信普通支付创建订单
     * @param orderNo 订单编号
     * @param productId 设备编号
     * @param productType 设备类型
     * @param siteId 商户编号
     * @param openid 微信标识
     * @param useFee 使用金额
     * @param payFee 支付金额
     * @param status 订单状态
     * @param payType 支付类型
     * @param siteName 商户名称
     * @param siteAddress 商户地址
     * @param createTime 创建时间
     * @param closeTime 订单封顶时间
     */
    public OrderPo(Long orderNo, String transactionId, Integer productId, Integer productType, Integer siteId, String openid, Integer useFee, Integer orderFee, Integer payFee, Integer status, Integer payType, String siteName, String siteAddress, Date createTime, Date closeTime, String mchid) {
        this.orderNo = orderNo;
        this.transactionId = transactionId;
        this.productId = productId;
        this.productType = productType;
        this.siteId = siteId;
        this.openid = openid;
        this.useFee = useFee;
        this.orderFee = orderFee;
        this.payFee = payFee;
        this.status = status;
        this.payType = payType;
        this.siteName = siteName;
        this.siteAddress = siteAddress;
        this.createTime = createTime;
        this.closeTime = closeTime;
        this.mchid = mchid;
    }

    /**
     * 支付宝订单数据
     * @param orderNo 订单编号
     * @param productId 设备编号
     * @param productType 设备类型
     * @param siteId 商户id
     * @param userId 支付宝唯一标识
     * @param useFee 用户使用金额
     * @param payFee 用户支付金额
     * @param status 订单状态
     * @param payType 支付类型
     * @param siteName 商户名称
     * @param siteAddress 商户地址
     * @param createTime 创建时间
     * @param closeTime 订单结束时间
     */
    public OrderPo(Long orderNo, Integer productId, Integer productType, Integer siteId, Long userId, Integer useFee, Integer orderFee, Integer payFee, Integer status, Integer payType, String siteName, String siteAddress, Date createTime, Date closeTime, String mchid) {
        this.orderNo = orderNo;
        this.productId = productId;
        this.productType = productType;
        this.siteId = siteId;
        this.userId = userId;
        this.useFee = useFee;
        this.orderFee = orderFee;
        this.payFee = payFee;
        this.status = status;
        this.payType = payType;
        this.siteName = siteName;
        this.siteAddress = siteAddress;
        this.createTime = createTime;
        this.closeTime = closeTime;
        this.mchid = mchid;
    }

    /**
     * 阿里资金冻结订单
     * @param orderNo 交易订单号
     * @param productId 设备编号
     * @param productType 设备类型
     * @param siteId 商户id
     * @param useFee 用户使用金额
     * @param payFee 用户支付金额
     * @param status 订单状态
     * @param payType 支付类型
     * @param siteName 商户名称
     * @param siteAddress 商户地址
     * @param createTime 创建时间
     * @param closeTime 订单关闭时间
     * @param userId 阿里用户id
     * @param authNo 订单授权号
     */
    public OrderPo(Long orderNo, Integer productId, Integer productType, Integer siteId, Integer useFee, Integer orderFee, Integer payFee, Integer status, Integer payType, String siteName, String siteAddress, Date createTime, Date closeTime, Long userId, String authNo, String mchid) {
        this.orderNo = orderNo;
        this.productId = productId;
        this.productType = productType;
        this.siteId = siteId;
        this.useFee = useFee;
        this.orderFee = orderFee;
        this.payFee = payFee;
        this.status = status;
        this.payType = payType;
        this.siteName = siteName;
        this.siteAddress = siteAddress;
        this.createTime = createTime;
        this.closeTime = closeTime;
        this.userId = userId;
        this.authNo = authNo;
        this.mchid = mchid;
    }
}
